package com.hjy.server;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.hjy.MyMain;
import com.hjy.utils.MyUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Server {

    public String mdFolder = ""; //  你想导出的md所在的文件夹
    public String newMdFolder = ""; //  导出的md所在新文件夹位置
    public String imgUrlPrefix = ""; //  md 文件引用的图片路径前缀
    public String newImgUrlPrefix = ""; //  修改 md 文件引用的图片路径前缀为新的前缀, 默认和 imgUrlPrefix 一致
    public String newImgFolder = ""; //  导出的图片所在位置, 为空默认为 newMdFolder\media

    public Server() {
        this.mdFolder = MyMain.mdFolder;
        this.newMdFolder = MyMain.newMdFolder;
        this.imgUrlPrefix = MyMain.imgUrlPrefix;
        this.newImgUrlPrefix = MyMain.newImgUrlPrefix;
        if (MyMain.newImgFolder.equals("")) {
            this.newImgFolder = this.newMdFolder + "\\media";
        }

    }

    public Server(String mdFolder, String newMdFolder, String imgUrlPrefix, String newImgUrlPrefix) {
        this.mdFolder = mdFolder;
        this.newMdFolder = newMdFolder;
        this.imgUrlPrefix = imgUrlPrefix;
        this.newImgUrlPrefix = newImgUrlPrefix;
        this.newImgFolder = this.newMdFolder + "/media";
    }

    public void generateNewMdFiles() {
        // 首先获取所有的 md 文件
        File mdFolder = new File(this.mdFolder);
        List<File> allMdFile = null;
        if (mdFolder.exists()) {
            if (mdFolder.isDirectory()) {
                allMdFile = MyUtil.getAllMdFile(mdFolder);
            } else {
                allMdFile = new ArrayList<>(List.of(mdFolder));
                this.mdFolder = this.mdFolder.substring(0, this.mdFolder.length() - mdFolder.getName().length() - 1);

            }
        } else {
            System.err.println(this.mdFolder + "文件夹不存在, 退出程序");
            System.exit(1); // 非正常退出
        }
        /* 生成新的文件夹 */
        // 文件夹不存在, 再创建
        if (!(new File(this.newMdFolder).exists())) {
            FileUtil.mkdir(new File(this.newMdFolder));
        }
        /* 解析出所有的图片, 并且保存到新文件夹下 */
        MyUtil.Res res = new MyUtil.Res();
        for (File mdFile : allMdFile) {
            if (!this.imgUrlPrefix.equals("")) {
                res = MyUtil.getImgUrls(this.imgUrlPrefix, this.newImgUrlPrefix, MyUtil.getFileContent(mdFile), this.newImgFolder);
            }
            MyUtil.Res res1 = MyUtil.getRelativeImgUrls(mdFile, this.newImgFolder + "\\absoluteImg");
            assert res != null;
            res.imgUrls.addAll(res1.imgUrls);
            res.urlMap.putAll(res1.urlMap);
            res.urlMap2.putAll(res1.urlMap2);


            List<String> imgUrls = res.imgUrls;
            Map<String, String> urlMap = res.urlMap;
            Map<String, String> urlMap2 = res.urlMap2;

            /* 拷贝所有图片到新的图片文件夹下 */
            for (String imgUrl : imgUrls) {
                // 保存文件
                String newFileName = urlMap.get(imgUrl);
                File newFile = new File(newFileName);
                // 创建文件
                try {
                    newFile = FileUtil.touch(newFile);
                } catch (Exception e) {
                    continue;
                }
                try {
                    FileUtil.copy(new File(imgUrl), newFile, true);
                } catch (Exception e) {
                    System.err.println(e);
                }

            }

            /* 生成所有的md文件, 用绝对或者相对路径加载每一张图片 */
            // 这个 md 文件的内容
            String fileContent = MyUtil.getFileContent(mdFile);
            // 这个 md 文件新的位置
            String newFilePath = MyUtil.getStandardPath(this.newMdFolder + mdFile.getAbsolutePath().substring(this.mdFolder.length()));
            // 处理其中图片的路径, 保存为相对路径或者绝对路径
            if (!MyMain.isAbsolutePath) {
                // 相对路径
                assert urlMap2 != null;
                for (String sourceImgUrl : urlMap2.keySet()) {
                    fileContent = StrUtil.replace(fileContent, sourceImgUrl, MyUtil.getRelativePath(urlMap2.get(sourceImgUrl), newFilePath));
                }
            } else {
                // 绝对路径
                for (String sourceImgUrl : urlMap2.keySet()) {
                    fileContent = StrUtil.replace(fileContent, sourceImgUrl, urlMap2.get(sourceImgUrl));
                }
            }
            // 保存
            MyUtil.saveFileContent(new File(newFilePath), fileContent);
        }
    }
}
